home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / msdos / cache / source / cmode.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-10-19  |  3.9 KB  |  180 lines

  1. /**********************************************
  2.  
  3.     cache deiver Program
  4.  
  5.     1991.04.15    make by Ken
  6.  
  7.     compile use : cl /Zp /Ze
  8.  
  9. ***********************************************/
  10. #include    <stdio.h>
  11. #include    <stdlib.h>
  12. #include    <malloc.h>
  13. #include    <dos.h>
  14. #include    "defs.h"
  15.  
  16. typedef struct {
  17.     char           mrk;
  18.     unsigned int   psp;
  19.     unsigned int   siz;
  20. } MCB;
  21.  
  22. void    Dev_str_call(char far *ent,REQ far *req);
  23. void    Dev_int_call(char far *ent);
  24. DPB far    *get_DPB(int dev);
  25.  
  26.     DPB     far    *dpb;
  27.     REQ         req;
  28.     int     use_count=0;
  29.     int     lru_count=0;
  30.     int        fre_count=0;
  31.     int     dev_use[MAX_DEV];
  32.  
  33. void    Cache_stat( void )
  34. {
  35.     int     i;
  36.     SEC_PTR far *sp;
  37.     ushort far  *lp;
  38.     ushort far  *up;
  39.  
  40.     use_count = lru_count = fre_count = 0;
  41.     for ( i = 0 ; i < MAX_DEV ; i++ )
  42.     dev_use[i] = 0;
  43.  
  44.     lp = (ushort far *)req.x.ext.lru_tbl;
  45.     up = (ushort far *)req.x.ext.use_tbl;
  46.  
  47.     for ( i = 0 ; i < MAX_HASH ; i++ ) {
  48.     sp = (SEC_PTR far *)lp;
  49.     FP_OFF(sp) = lp[i];
  50.     while ( FP_OFF(sp) != 0 ) {
  51.         if ( sp->dev != FRE_DEV ) {
  52.         dev_use[sp->dev]++;
  53.         lru_count++;
  54.         } else
  55.         fre_count++;
  56.         FP_OFF(sp) = (ushort)sp->next;
  57.     }
  58.  
  59.     sp = (SEC_PTR far *)up;
  60.     FP_OFF(sp) = up[i];
  61.     while ( FP_OFF(sp) != 0 ) {
  62.         use_count++;
  63.         FP_OFF(sp) = (ushort)sp->next;
  64.     }
  65.     }
  66. }
  67. void    Device_call( void )
  68. {
  69.     char far *p;
  70.  
  71.     p = (char far *)(dpb->DevEnt);
  72.  
  73.     FP_OFF(p) = dpb->DevEnt->str_ent;
  74.     Dev_str_call(p,(REQ far *)(&req));
  75.  
  76.     FP_OFF(p) = dpb->DevEnt->int_ent;
  77.     Dev_int_call(p);
  78. }
  79. void    mcb_clear(ushort psp)
  80. {
  81.     unsigned int     u;
  82.     union REGS       regs;
  83.     struct SREGS     sregs;
  84.     unsigned short far *p;
  85.     MCB far         *mcb;
  86.  
  87.     regs.h.ah = 0x52;
  88.     int86x(0x21,®s,®s,&sregs);
  89.  
  90.     FP_OFF(p) = regs.x.bx - 2;
  91.     FP_SEG(p) = sregs.es;
  92.  
  93.     FP_OFF(mcb) = 0;
  94.     FP_SEG(mcb) = *p;
  95.  
  96.     for ( ; ; ) {
  97.     if ( mcb->psp == psp )
  98.         mcb->psp = _psp;
  99.     if ( mcb->mrk == 'Z' )
  100.         break;
  101.     u = FP_SEG(mcb) + mcb->siz + 1;
  102.     FP_SEG(mcb) = u;
  103.     }
  104.  
  105. }
  106. int    main(int argc,char *argv[])
  107. {
  108.     int     i,dev=(-1);
  109.     int     out_flg = FALSE;
  110.     char    *p;
  111.     DPB far *dp;
  112.     unsigned long far *lp;
  113.  
  114.     while ( --argc > 0 ) {
  115.     p = *(++argv);
  116.     if ( *p == '-' )
  117.         out_flg = TRUE;
  118.     else
  119.         dev = toupper(*p) - 'A';
  120.     }
  121.  
  122.     if ( dev < 0 ) {
  123.     fprintf(stderr,"use: CMODE <Cache Buffer Device> [-]\n");
  124.     return 1;
  125.     }
  126.  
  127.     if ( (dpb = get_DPB(dev)) == NULL ) {
  128.     fprintf(stderr,"Can't get DPB %c: Device\n",dev+'A');
  129.     return 1;
  130.     }
  131.  
  132.     req.len = 28;
  133.     req.unit = dpb->UnitNum;
  134.     req.cmds = (out_flg == FALSE ? 80:81);    /* Ext Cache Command */
  135.     req.stat = 0;
  136.     req.md_id = dpb->MedId;
  137.     Device_call();
  138.  
  139.     if ( (req.stat & 0x8000) != 0 ) {
  140.     fprintf(stderr,"Can't Cache Device %c:\n",dev+'A');
  141.     return 1;
  142.     }
  143.  
  144.     if ( out_flg != FALSE ) {
  145.     mcb_clear(req.x.quit.psp_seg);
  146.     printf("キャッシュを解除しました\n");
  147.  
  148.     } else {
  149.     Cache_stat();
  150.  
  151.     printf("    キャッシュバッファデバイス名  %c\n",dev+'A');
  152.  
  153.     printf("    キャッシュしているデバイス名  ");
  154.     lp = (unsigned long far *)req.x.ext.dpb_ptr;
  155.     for ( i = 1 ; i < req.x.ext.max_dev ; i++ ) {
  156.         dp = (DPB far *)(lp[i]);
  157.         printf("%c ",dp->DrvNum+'A');
  158.     }
  159.     printf("\n");
  160.  
  161.     printf("        現在のキャッシュ動作状況  %s\n",
  162.             req.x.ext.mode == FALSE ? "有効":"無効");
  163.  
  164.     i = use_count + lru_count + fre_count;
  165.     printf("          全てのバッファセクタ数  %-4d (%dK)\n",i,
  166.                     (int)((long)i*dpb->SecLen/1024L));
  167.  
  168.     printf("  デバイスが使用しているセクタ数  %-4d (%dK)\n",use_count,
  169.                 (int)((long)use_count*dpb->SecLen/1024L));
  170.  
  171.     printf("キャッシュで使用しているセクタ数  %-4d (%dK)\n",lru_count,
  172.                 (int)((long)lru_count*dpb->SecLen/1024L));
  173.  
  174.     printf("              現在の空きセクタ数  %-4d (%dK)\n",fre_count,
  175.                 (int)((long)fre_count*dpb->SecLen/1024L));
  176.     }
  177.  
  178.     return 0;
  179. }
  180.